package controller;

import java.util.ArrayList;
import java.util.List;

import model.Ingrediente;
import model.Insumo;
import model.Producto;
import model.Semielaborado;
import model.Simple;
import beans.IngredienteBean;
import beans.InsumoBean;
import beans.ProductoBean;
import beans.SemielaboradoBean;
import beans.SimpleBean;
import dao.HibernateProductoDAO;
import dto.IngredienteDTO;
import dto.InsumoDTO;
import dto.ProductoDTO;
import dto.SemielaboradoDTO;
import dto.SimpleDTO;

public class AdministradorProducto {
	private static AdministradorProducto instancia;

	private AdministradorProducto() {

	}

	public static AdministradorProducto getInstancia() {
		if (instancia == null)
			instancia = new AdministradorProducto();
		return instancia;
	}

	public ProductoBean fromModelTOBean(Producto producto) {
		ProductoBean productoBean = null;
		if (producto != null) {
			if (producto.getClass().toString().contains("Ingrediente")) {
				IngredienteBean productoBean1 = new IngredienteBean();
				productoBean1.setId(producto.getId());
				productoBean1.setCategorizacion(producto.getCategorizacion());
				productoBean1.setNombre(producto.getNombre());
				productoBean1.setProovedores(AdministradorProovedor
						.getInstancia().fromModelTOBean(
								producto.getProovedores()));
				productoBean1.setFresco(((Ingrediente) producto).isFresco());
				return productoBean1;
			}
			if (producto.getClass().toString().contains("Simple")) {
				SimpleBean productoBean1 = new SimpleBean();
				productoBean1.setId(producto.getId());
				productoBean1.setCategorizacion(producto.getCategorizacion());
				productoBean1.setNombre(producto.getNombre());
				productoBean1.setProovedores(AdministradorProovedor
						.getInstancia().fromModelTOBean(
								producto.getProovedores()));
				return productoBean1;
			}
			if (producto.getClass().toString().contains("Insumo")) {
				InsumoBean productoBean1 = new InsumoBean();
				productoBean1.setId(producto.getId());
				productoBean1.setCategorizacion(producto.getCategorizacion());
				productoBean1.setNombre(producto.getNombre());
				productoBean1.setProovedores(AdministradorProovedor
						.getInstancia().fromModelTOBean(
								producto.getProovedores()));
				return productoBean1;
			}
			if (producto.getClass().toString().contains("Semielaborado")) {
				SemielaboradoBean productoBean1 = new SemielaboradoBean();
				productoBean1.setId(producto.getId());
				productoBean1.setCategorizacion(producto.getCategorizacion());
				productoBean1.setNombre(producto.getNombre());
				productoBean1.setProovedores(AdministradorProovedor
						.getInstancia().fromModelTOBean(
								producto.getProovedores()));
				productoBean1.setFresco(((Semielaborado) producto).isFresco());
				productoBean1
						.setReceta(AdministradorReceta.getInstancia()
								.fromModelTOBean(
										((Semielaborado) producto).getReceta()));
				return productoBean1;
			}
		}
		return productoBean;
	}

	public Producto fromDTOTOModel(ProductoDTO productoDTO) {
		Producto producto = null;
		if (productoDTO != null) {
			if (productoDTO.getClass().toString().contains("Ingrediente")) {
				Ingrediente producto1 = new Ingrediente();
				producto1.setId(productoDTO.getId());
				producto1.setCategorizacion(productoDTO.getCategorizacion());
				producto1.setNombre(productoDTO.getNombre());
				producto1.setProovedores(AdministradorProovedor.getInstancia()
						.fromDTOTOModel(productoDTO.getProovedores()));
				producto1.setFresco(((IngredienteDTO) productoDTO).isFresco());
				return producto1;
			}
			if (productoDTO.getClass().toString().contains("Simple")) {
				Simple producto1 = new Simple();
				producto1.setId(productoDTO.getId());
				producto1.setCategorizacion(productoDTO.getCategorizacion());
				producto1.setNombre(productoDTO.getNombre());
				producto1.setProovedores(AdministradorProovedor.getInstancia()
						.fromDTOTOModel(productoDTO.getProovedores()));
				return producto1;
			}
			if (productoDTO.getClass().toString().contains("Insumo")) {
				Insumo producto1 = new Insumo();
				producto1.setId(productoDTO.getId());
				producto1.setCategorizacion(productoDTO.getCategorizacion());
				producto1.setNombre(productoDTO.getNombre());
				producto1.setProovedores(AdministradorProovedor.getInstancia()
						.fromDTOTOModel(productoDTO.getProovedores()));
				return producto1;
			}
			if (productoDTO.getClass().toString().contains("Semielaborado")) {
				Semielaborado producto1 = new Semielaborado();
				producto1.setId(productoDTO.getId());
				producto1.setCategorizacion(productoDTO.getCategorizacion());
				producto1.setNombre(productoDTO.getNombre());
				producto1.setProovedores(AdministradorProovedor.getInstancia()
						.fromDTOTOModel(productoDTO.getProovedores()));
				producto1
						.setFresco(((SemielaboradoDTO) productoDTO).isFresco());
				producto1.setReceta(AdministradorReceta.getInstancia()
						.fromDTOTOModel(
								((SemielaboradoDTO) productoDTO).getReceta()));
				return producto1;
			}
		}
		return producto;
	}

	public Producto fromBeanTOModel(ProductoBean productoBean) {
		Producto producto = null;
		if (productoBean != null) {
			if (productoBean.getClass().toString().contains("Ingrediente")) {
				Ingrediente producto1 = new Ingrediente();
				producto1.setId(productoBean.getId());
				producto1.setCategorizacion(productoBean.getCategorizacion());
				producto1.setNombre(productoBean.getNombre());
				producto1.setProovedores(AdministradorProovedor.getInstancia()
						.fromBeanTOModel(productoBean.getProovedores()));
				producto1
						.setFresco(((IngredienteBean) productoBean).isFresco());
				return producto1;
			}
			if (productoBean.getClass().toString().contains("Simple")) {
				Simple producto1 = new Simple();
				producto1.setId(productoBean.getId());
				producto1.setCategorizacion(productoBean.getCategorizacion());
				producto1.setNombre(productoBean.getNombre());
				producto1.setProovedores(AdministradorProovedor.getInstancia()
						.fromBeanTOModel(productoBean.getProovedores()));
				return producto1;
			}
			if (productoBean.getClass().toString().contains("Insumo")) {
				Insumo producto1 = new Insumo();
				producto1.setId(productoBean.getId());
				producto1.setCategorizacion(productoBean.getCategorizacion());
				producto1.setNombre(productoBean.getNombre());
				producto1.setProovedores(AdministradorProovedor.getInstancia()
						.fromBeanTOModel(productoBean.getProovedores()));
				return producto1;
			}
			if (productoBean.getClass().toString().contains("Semielaborado")) {
				Semielaborado producto1 = new Semielaborado();
				producto1.setId(productoBean.getId());
				producto1.setCategorizacion(productoBean.getCategorizacion());
				producto1.setNombre(productoBean.getNombre());
				producto1.setProovedores(AdministradorProovedor.getInstancia()
						.fromBeanTOModel(productoBean.getProovedores()));
				producto1.setFresco(((SemielaboradoBean) productoBean)
						.isFresco());
				producto1
						.setReceta(AdministradorReceta.getInstancia()
								.fromBeanTOModel(
										((SemielaboradoBean) productoBean)
												.getReceta()));
				return producto1;
			}
		}
		return producto;
	}

	public List<Producto> fromDTOTOModel(List<ProductoDTO> productosDTO) {
		List<Producto> productos = new ArrayList<Producto>();
		for (ProductoDTO prod : productosDTO) {
			productos.add(fromDTOTOModel(prod));
		}
		return productos;
	}

	public List<ProductoDTO> fromModelTODTO(List<Producto> productos) {
		List<ProductoDTO> productosDTO = new ArrayList<ProductoDTO>();
		for (Producto prod : productos) {
			productosDTO.add(fromModelTODTO(prod));
		}
		return productosDTO;
	}

	public ProductoDTO fromModelTODTO(Producto producto) {
		ProductoDTO productoDTO = null;
		if (producto != null) {
			if (producto.getClass().toString().contains("Ingrediente")) {
				IngredienteDTO productoBean1 = new IngredienteDTO();
				productoBean1.setId(producto.getId());
				productoBean1.setCategorizacion(producto.getCategorizacion());
				productoBean1.setNombre(producto.getNombre());
				productoBean1.setProovedores(AdministradorProovedor
						.getInstancia().fromModelTODTO(
								producto.getProovedores()));
				productoBean1.setFresco(((Ingrediente) producto).isFresco());
				return productoBean1;
			}
			if (producto.getClass().toString().contains("Simple")) {
				SimpleDTO productoBean1 = new SimpleDTO();
				productoBean1.setId(producto.getId());
				productoBean1.setCategorizacion(producto.getCategorizacion());
				productoBean1.setNombre(producto.getNombre());
				productoBean1.setProovedores(AdministradorProovedor
						.getInstancia().fromModelTODTO(
								producto.getProovedores()));
				return productoBean1;
			}
			if (producto.getClass().toString().contains("Insumo")) {
				InsumoDTO productoBean1 = new InsumoDTO();
				productoBean1.setId(producto.getId());
				productoBean1.setCategorizacion(producto.getCategorizacion());
				productoBean1.setNombre(producto.getNombre());
				productoBean1.setProovedores(AdministradorProovedor
						.getInstancia().fromModelTODTO(
								producto.getProovedores()));
				return productoBean1;
			}
			if (producto.getClass().toString().contains("Semielaborado")) {
				SemielaboradoDTO productoBean1 = new SemielaboradoDTO();
				productoBean1.setId(producto.getId());
				productoBean1.setCategorizacion(producto.getCategorizacion());
				productoBean1.setNombre(producto.getNombre());
				productoBean1.setProovedores(AdministradorProovedor
						.getInstancia().fromModelTODTO(
								producto.getProovedores()));
				productoBean1.setFresco(((Semielaborado) producto).isFresco());
				productoBean1
						.setReceta(AdministradorReceta.getInstancia()
								.fromModelTODTO(
										((Semielaborado) producto).getReceta()));
				return productoBean1;
			}
		}
		return productoDTO;
	}

	public void grabarProducto(Producto producto) {
		ProductoBean productob = fromModelTOBean(producto);
		HibernateProductoDAO.getInstancia().grabarProducto(productob);

	}

	public Ingrediente buscarIngrediente(Ingrediente i) {
		IngredienteBean ib = (IngredienteBean) fromModelTOBean(i);
		ib = HibernateProductoDAO.getInstancia().buscarIngrediente(ib);
		return (Ingrediente) fromBeanTOModel(ib);
	}

	public Simple buscarSimple(Simple s) {
		SimpleBean sb = (SimpleBean) fromModelTOBean(s);
		sb = HibernateProductoDAO.getInstancia().buscarSimple(sb);
		return (Simple) fromBeanTOModel(sb);
	}

	public Semielaborado buscarSemielaborado(Semielaborado s) {
		SemielaboradoBean sb = (SemielaboradoBean) fromModelTOBean(s);
		sb = HibernateProductoDAO.getInstancia().buscarSemielaborado(sb);
		return (Semielaborado) fromBeanTOModel(sb);
	}

	public Insumo buscarInsumo(Insumo s) {
		InsumoBean sb = (InsumoBean) fromModelTOBean(s);
		sb = HibernateProductoDAO.getInstancia().buscarInsumo(sb);
		return (Insumo) fromBeanTOModel(sb);
	}

	public void updateProducto(Producto producto3) {
		ProductoBean productobean = fromModelTOBean(producto3);
		HibernateProductoDAO.getInstancia().update(productobean);

	}

	public List<Producto> listarIngredientes() {
		List<Producto> ingredientes = new ArrayList<Producto>();
		List<IngredienteBean> ingredientesBeans = HibernateProductoDAO
				.getInstancia().listarIngredientes();
		for (IngredienteBean ingredienteBean : ingredientesBeans) {
			ingredientes.add(fromBeanTOModel(ingredienteBean));
		}
		return ingredientes;
	}

	public List<Producto> listarSimples() {
		List<Producto> simples = new ArrayList<Producto>();
		List<SimpleBean> simpleBeans = HibernateProductoDAO.getInstancia()
				.listarSimples();
		for (SimpleBean simpleBean : simpleBeans) {
			simples.add(fromBeanTOModel(simpleBean));
		}
		return simples;
	}

	public List<Producto> listarInsumos() {
		List<Producto> insumos = new ArrayList<Producto>();
		List<InsumoBean> insumosBeans = HibernateProductoDAO.getInstancia()
				.listarInsumos();
		for (InsumoBean insumoBean : insumosBeans) {
			insumos.add(fromBeanTOModel(insumoBean));
		}
		return insumos;
	}

	public List<Producto> listarSemielaborados() {
		List<Producto> semielaborados = new ArrayList<Producto>();
		List<SemielaboradoBean> semielaboradoBeans = HibernateProductoDAO
				.getInstancia().listarSemielaborados();
		for (SemielaboradoBean semielaboradoBean : semielaboradoBeans) {
			semielaborados.add(fromBeanTOModel(semielaboradoBean));
		}
		return semielaborados;
	}
}
